﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Web.UI.WebControls;
using AjaxControlToolkit;
using System.Web.UI;

namespace Sistema_Totem.Clases
{
    public class Propuesta : Documento
    {

        #region Constructor(es) 
        
        public Propuesta()
        {
        }

        #endregion Constructor(es)

        #region Metodos

        /// <summary>
        /// Retorna una lista de Secciones llenas con sus elementos a partir de un xml
        /// </summary>
        /// <param name="xml">el xml</param>
        /// <param name="ruta_Xml">si esta en disco, la ruta</param>
        /// <param name="defecto">si son secciones que vienen seleccionadas desde un gridview o no</param>
        /// <param name="seccionesPer">lista con los nombres si vienen de un gridview</param>
        /// <returns></returns>
        public List<Seccion> Secciones(XmlDocument xml, string ruta_Xml, bool defecto = true, List<string> seccionesPer = null)
        {

            List<Seccion> seccionesXml = new List<Seccion>();

            //xml.Load(ruta_Xml);
            XmlNode root;
            root = xml.DocumentElement;


            foreach (XmlElement secciones in root.ChildNodes) // reviso los hijos del root
            {


                if ((secciones.Name == "SECCION") && (defecto == true)) // si estoy revisando los hijos llamados Seccion
                {


                    Seccion seccion = new Seccion();
                    seccion.Nombre = secciones.ChildNodes.Item(0).InnerText;
                    seccion.ListaControl = ElementosSeccion(secciones);
                    seccionesXml.Add(seccion);
                }

                else
                {
                    if (defecto == false)
                    {
                        bool cargar = seccionesPersonalizadas(seccionesPer, secciones.ChildNodes.Item(0).InnerText);

                        if ((secciones.Name == "SECCION") && (cargar == true))// si estoy revisando los hijos llamados Seccion
                        {

                            Seccion seccion = new Seccion();
                            seccion.Nombre = secciones.ChildNodes.Item(0).InnerText;
                            seccion.ListaControl = ElementosSeccion(secciones);
                            seccionesXml.Add(seccion);
                        }
                    }
                }


            }


            return seccionesXml;
        }

        /// <summary>
        /// Metodo que dice si la lista de secciones personalizadas que llego contiene secciones existentes
        /// </summary>
        /// <param name="secciones">lista con los nombres de las secciones</param>
        /// <param name="seccion">nombre de la seccion</param>
        /// <returns>True si existe y se va a agregar, falso lo contrario</returns>
        public Boolean seccionesPersonalizadas(List<string> secciones, string seccion)
        {
            bool agregar = false;

            if (secciones.Contains(seccion))
            {

                agregar = true;

            }

            return agregar;

        }

        /// <summary>
        /// Metodo que "pinta" un acordeon a partir de una plantilla vacia o llena
        /// </summary>
        /// <param name="accordion">El acordeon que va a lenar</param>
        /// <param name="xml">El xml con la estructura que tiene que pintar</param>
        /// <param name="ruta">Ruta si es un xml en disco</param>
        /// <param name="defecto"></param>
        /// <param name="seccionesPer"></param>
        /// <returns></returns>
        public Accordion PintarPlantillaAgregar(Accordion accordion, XmlDocument xml, string ruta, bool defecto = true, List<string> seccionesPer = null)
        {
            this.ListaSeccion = Secciones(xml, ruta, defecto, seccionesPer);

            int j = 0;
            foreach (Seccion seccion in this.ListaSeccion)
            {
                //System.Diagnostics.Debug.WriteLine("Seccion: " + seccion.Nombre);
                AccordionPane pane = new AccordionPane();
                pane.ID = seccion.Nombre;
                pane.HeaderContainer.Controls.Add(new LiteralControl(seccion.Nombre));

                foreach (ElementoControl control in seccion.ListaControl)
                {
                    //System.Diagnostics.Debug.WriteLine("Elemento: " + control.Nombre + " Tipo: " + control.Tipo + " Estado: " + control.Estado + " Contenido: " + control.Contenido);
                    Label elementovista = new Label();

                    elementovista.Text = control.Nombre + ": ";
                    elementovista.ID = "Elemento " + j.ToString();
                    elementovista.CssClass = "labelpropuesta2";

                    pane.ContentContainer.Controls.Add(elementovista);
                    System.Web.UI.Control controlweb = ElementoToWebControl(control, "Elementoweb" + j.ToString());

                    pane.ContentContainer.Controls.Add(controlweb);
                    j++;
                }
                accordion.Panes.Add(pane);

            }

            return accordion;
        }

        /// <summary>
        /// Crea una lista de elementocontro a partir de un elemento xml seccion (con elementos adentro)
        /// </summary>
        /// <param name="seccion"></param>
        /// <returns></returns>
        public List<ElementoControl> ElementosSeccion(XmlElement seccion)
        {

            List<ElementoControl> elementos = new List<ElementoControl>();

            foreach (XmlElement elementosSeccion in seccion.ChildNodes)
            {
                if (elementosSeccion.Name == "ELEMENTO")
                {

                    elementos.Add(XmlToElemento(elementosSeccion));
                }

            }

            return elementos;
        }

        /// <summary>
        /// Crea un Elemento Control desde un elemento xml
        /// </summary>
        /// <param name="elemento"></param>
        /// <returns></returns>
        public ElementoControl XmlToElemento(XmlElement elemento)
        {
            ElementoControl control = new ElementoControl();

            List<Comportamiento> comportamientos = new List<Comportamiento>();

            foreach (XmlElement valores in elemento.ChildNodes)
            {

                if (valores.Name == "NOMBRE")
                {
                    control.Nombre = valores.InnerText;
                }

                if (valores.Name == "TIPO")
                {
                    control.Tipo = valores.InnerText;
                }

                if (valores.Name == "ESTADO")
                {
                    control.Estado = valores.InnerText;
                }

                if (valores.Name == "CONTENIDO")
                {
                    control.Contenido = valores.InnerText;
                }

                if (valores.Name == "VALIDACION")
                {

                    Comportamiento comportamiento = new Comportamiento();
                    comportamiento.Nombre = valores.InnerText;
                    comportamientos.Add(comportamiento);
                }


            }

            control.ListaComportamiento = comportamientos;

            return control;
        }

        /// <summary>
        /// Crea un elemento xml SECCION
        /// </summary>
        /// <param name="xml"></param>
        /// <param name="titulo"></param>
        /// <param name="elementos"></param>
        /// <returns></returns>
        public XmlElement CrearSeccion(XmlDocument xml, string titulo, List<XmlElement> elementos)
        {


            XmlElement seccion = xml.CreateElement("SECCION");
            XmlElement tituloSeccion = xml.CreateElement("TITULO");
            tituloSeccion.InnerText = titulo;
            seccion.AppendChild(tituloSeccion);
            foreach (XmlElement elemento in elementos)
            {
                seccion.AppendChild(elemento);
            }
            return seccion;

        }

        /// <summary>
        /// Crea un elemento xml ELEMENTO
        /// </summary>
        /// <param name="controlweb"></param>
        /// <param name="xml"></param>
        /// <returns></returns>
        public XmlElement CrearElemento(ElementoControl controlweb, XmlDocument xml)
        {
            XmlElement control = xml.CreateElement("ELEMENTO");
            XmlElement nombre = xml.CreateElement("NOMBRE");
            XmlElement tipo = xml.CreateElement("TIPO");
            XmlElement estado = xml.CreateElement("ESTADO");
            XmlElement contenido = xml.CreateElement("CONTENIDO");
            nombre.InnerText = controlweb.Nombre;
            tipo.InnerText = controlweb.Tipo;
            estado.InnerText = controlweb.Estado;
            contenido.InnerText = controlweb.Contenido;
            control.AppendChild(nombre);
            control.AppendChild(tipo);
            control.AppendChild(estado);
            control.AppendChild(contenido);

            /*

            foreach (Comportamiento comportamiento in controlweb.ListaComportamiento)
            {
                XmlElement validacion = xml.CreateElement("VALIDACION");
                validacion.Value = comportamiento.Nombre;
                control.AppendChild(validacion);
            }
           */
            return control;
        }

        /// <summary>
        /// Devuelve los controles web que van a ser pintados
        /// </summary>
        /// <param name="elemento"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public System.Web.UI.Control ElementoToWebControl(ElementoControl elemento, string id)
        {

            System.Web.UI.Control control = new System.Web.UI.Control();


            if (elemento.Tipo == "TEXTBOX")
            {

                TextBox controlweb = new TextBox();
                controlweb.TextMode = TextBoxMode.MultiLine;
                controlweb.Text = elemento.Contenido;
                controlweb.ID = id;
                controlweb.CssClass = "Textbox";
                control = controlweb;
                //System.Diagnostics.Debug.WriteLine(elemento.Tipo);

            }


            return control;
        }

        /// <summary>
        /// Metodo que recibe un acordion y lo convierte a xml
        /// </summary>
        /// <param name="accordion">el acordion a convertir</param>
        /// <returns>el documento xml</returns>
        public XmlDocument AccordionToXml(AjaxControlToolkit.Accordion accordion)
        {
            string ruta = System.AppDomain.CurrentDomain.BaseDirectory + "Propuestanueva.xml";
            XmlTextWriter escritor = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            escritor.Formatting = Formatting.Indented;
            escritor.WriteStartDocument();
            escritor.WriteStartElement("PLANTILLA");
            escritor.WriteStartElement("REFERENCIAS");
            escritor.WriteStartElement("PROPUESTA");
            escritor.WriteEndElement();
            escritor.WriteEndElement();


            XmlDocument xml = new XmlDocument();
            xml.CreateXmlDeclaration("1.0", "utf-8", "no");

            string nombre = "";

            //System.Diagnostics.Debug.WriteLine(accordion.Panes.Count().ToString()); // imprime correctamente la cantidad de panes.

            foreach (AjaxControlToolkit.AccordionPane pane in accordion.Panes)
            {

                //System.Diagnostics.Debug.WriteLine(pane.ContentContainer.Controls.Count); // cuenta los elementos de cada panel correctamente.

                escritor.WriteStartElement("SECCION");


                LiteralControl x = (LiteralControl)pane.HeaderContainer.Controls[0];

                escritor.WriteElementString("TITULO", x.Text);
                //System.Diagnostics.Debug.WriteLine(x.Text);


                List<XmlElement> elementos = new List<XmlElement>();

                foreach (System.Web.UI.Control control in pane.ContentContainer.Controls)
                {


                    //System.Diagnostics.Debug.WriteLine(control.ToString());


                    if (control is Label)
                    {
                        escritor.WriteStartElement("ELEMENTO");
                        Label label = (Label)control;

                        nombre = label.Text;
                        escritor.WriteElementString("NOMBRE", nombre);

                    }
                    else
                    {
                        if (control is TextBox)
                        {
                            //ElementoControl elemento = WebControlToElemento(control, nombre);

                            //elementos.Add(CrearElemento(elemento, xml));
                            escritor.WriteElementString("TIPO", "TEXTBOX");
                            escritor.WriteElementString("ESTADO", "ACTIVADO");
                            TextBox textbox = (TextBox)control;
                            escritor.WriteElementString("CONTENIDO", textbox.Text);
                            escritor.WriteEndElement();
                        }

                    }

                }
                escritor.WriteEndElement();



            }
            escritor.WriteEndElement();
            escritor.Flush();
            escritor.Close();
            xml.PreserveWhitespace = true;
            xml.Load(ruta);
            //System.Diagnostics.Debug.Write(xml.InnerXml);
            return xml;


        }

        #endregion Metodos

    }
}